package com.wx.gof.pattern.creational.abstractfactory;

/**
 * @ClassName Application
 * @Author wx
 * @Description
 * 定义:
 * 抽象工厂的功能是为一系列相关对象或相互依赖的对象创建一个接口
 * 产品族和产品等级:
 * 产品等级 = 手机、耳机
 * 产品族 = 小米手机 + 小米耳机
 * 描述:
 * 抽象工厂模式是对象的创建模式，它是工厂方法模式的进一步推广。抽象工厂模式与工厂方法模式的最大区别就在于，
 * 工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。
 * 适应场景：
 * 1.创建一系列对象需要大量重复的代码（属于统一产品族）
 * 2.应用程序不依赖对象如何被创建、实现等细节
 * 优点:
 * 1.符合开闭原则，提高扩展性
 * 2.应用程序只需要关心对象对应的产品工厂，无须关心细节
 * 3.将一个系列的产品统一到一起创建
 * 缺点:
 * 1.类的个数容易过多，增加复杂度
 * 2.规定了所有可能创建的产品集合，产品族中扩展新的产品困难，需要修改抽象工厂
 * 理解:
 * 应用程序-抽象工厂模式(适合产品族并且产品等级比较固定的设计,抽象工厂是核心，具体创建对象的操作交给子类工厂)
 * @Date 2018-12-02-22:41
 */
public class Application {
    public static void main(String[] agrs){
        PhoneCompanyFactory phoneFactory = new XiaoMiCompanyFactory();
        Phone phone = phoneFactory.getPhone();
        phone.produce();
        Headset headset = phoneFactory.getHeadset();
        headset.produce();
    }
}
